/**
 * Project:   warnme-app
 * File:      WarningDialog.java
 * License: 
 *            This file is licensed under GNU General Public License version 3
 *            http://www.gnu.org/licenses/gpl-3.0.txt
 *
 * Copyright: Bartosz Cichecki [ cichecki.bartosz@gmail.com ]
 * Date:      Apr 2, 2014
 */

package dtu.ds.warnme.app.dialog;

import org.apache.http.Header;

import android.app.AlertDialog;
import android.app.Dialog;
import android.app.DialogFragment;
import android.content.DialogInterface;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;

import com.loopj.android.http.AsyncHttpResponseHandler;

import dtu.ds.warnme.app.R;
import dtu.ds.warnme.app.activity.MainActivity;
import dtu.ds.warnme.app.model.impl.Event;
import dtu.ds.warnme.app.ws.client.restful.RestClientHolder;

/**
 * @author Bartosz Cichecki
 * 
 */
public class WarningDialog extends DialogFragment {

	private final static String TAG = "WarningDialog";

	private AlertDialog dialog;

	private Event event;

	public Event getEvent() {
		return event;
	}

	private int getMessage(Event event) {
		switch (event.getEventType()) {
			case ACCIDENT:
				return R.string.warning_message_accident;
			case POLICE:
				return R.string.warning_message_police;
			case SPEEDCAMERA:
				return R.string.warning_message_speed_camera;
		}
		throw new IllegalStateException("Unknown value of EventType.");

	}

	@Override
	public Dialog onCreateDialog(Bundle savedInstanceState) {
		final Event event = (Event) getArguments().get(MainActivity.KEY_EVENT);

		AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(getActivity());
		dialogBuilder.setTitle(R.string.warning);
		dialogBuilder.setMessage(getMessage(event));
		dialogBuilder.setPositiveButton(R.string.confirm, new DialogInterface.OnClickListener() {

			@Override
			public void onClick(DialogInterface dialog, int which) {
				// Nothing to do here...
			}
		});
		dialogBuilder.setNegativeButton(R.string.decline, new DialogInterface.OnClickListener() {

			@Override
			public void onClick(DialogInterface dialog, int which) {
				// Nothing to do here...

			}
		});

		dialog = dialogBuilder.create();

		dialog.setOnShowListener(new DialogInterface.OnShowListener() {

			@Override
			public void onShow(DialogInterface dialogInterface) {
				final Button positiveButton = dialog.getButton(DialogInterface.BUTTON_POSITIVE);
				final Button negativeButton = dialog.getButton(DialogInterface.BUTTON_NEGATIVE);

				positiveButton.setOnClickListener(new View.OnClickListener() {

					@Override
					public void onClick(View v) {
						RestClientHolder.getRestClient().upVoteEvent(dialog.getContext(), event, new AsyncHttpResponseHandler() {

							@Override
							public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
								Log.i(TAG, "Failed to upvote event " + event.getId() + " cause: " + error);
							}

							@Override
							public void onFinish() {
								dialog.dismiss();
							}

							@Override
							public void onStart() {
								positiveButton.setEnabled(false);
								negativeButton.setEnabled(false);
							}

							@Override
							public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
								Log.i(TAG, "Event " + event.getId() + " upvoted with success");
							}

						});
					}
				});

				negativeButton.setOnClickListener(new View.OnClickListener() {

					@Override
					public void onClick(View v) {
						RestClientHolder.getRestClient().downVoteEvent(dialog.getContext(), event, new AsyncHttpResponseHandler() {

							@Override
							public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
								Log.i(TAG, "Failed to downvote event " + event.getId() + " cause: " + error);
							}

							@Override
							public void onFinish() {
								dialog.dismiss();
							}

							@Override
							public void onStart() {
								positiveButton.setEnabled(false);
								negativeButton.setEnabled(false);
							}

							@Override
							public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
								Log.i(TAG, "Event " + event.getId() + " downvoted with success");
							}

						});
					}
				});

			}
		});

		return dialog;
	}

	public void setEvent(Event event) {
		this.event = event;
	}

}
